GDB 這東西已經有太多人介紹過怎麼操作,這部分是有點無聊,但在了解原理前,還是學會怎麼使用吧
b main
breakpoint by functionb *main+10
breakpoint by addressb 40
breakpoint at line 40b 目前位置
b 100
b function
b 100 if (var == 5)
br 100
commands
silent
printf "x is %d\n", x
end
clear 1 清除1號中斷點
p variable
p variable[1]@5 印出 variable[1] - variable[5]
p variable=5 要修改變數可以直接使用 print,它也有 eval 的功能然後就只是多了印出
x/4 &a
x/4 0x8000000
#include <stdio.h>
int main() {
int x = 10;
x = 12;
printf("x = %d\n", x);
printf("x = %d\n", x);
return 0;
}
可以拿編譯出來的檔案,用 GDB 下去跑跑看,編譯的時候記得下 -g
,才會有 debug info
下面做的事很簡單,有兩行輸出,我把斷點下在第七行,這時只有第一個 printf 會執行,接著我使用 print 來修改 x 的數值,再讓他繼續執行,就可以發現 x 數值真的被改動了
GDB debug 通常不是拿來改數值,而是拿來觀看數值,以及 function 之間是如何呼叫,也就是 backtrace 來看 stack 的內容,這可以自行下去摸索
> gdb ./sample
(gdb) list
1 #include <stdio.h>
2
3 int main() {
4 int x = 10;
5 x = 12;
6 printf("x = %d\n", x);
7 printf("x = %d\n", x);
8 return 0;
9 }
(gdb) b 7
Breakpoint 1 at 0x676: file sample.c, line 7.
(gdb) r
Starting program: /home/chungyi/gitPro/ithome2020/day1/sample
x = 12
Breakpoint 1, main () at sample.c:7
7 printf("x = %d\n", x);
(gdb) p x=133
$1 = 133
(gdb) c
Continuing.
x = 133
[Inferior 1 (process 5043) exited normally]
像是 .bashrc
一樣,GDB 也有設定檔可以使用,那就是 .gdbinit
,根據 gdbinit man 裡所敘述,我們可以把 .gdbinit
放在在家目錄或是當前目錄,都會被自動讀取,以下就介紹一些,我常用到的功能
set history save on
set history filename ~/.gdb-history
set history size 1000
set debug remote 1
明天打算講 Bomb Lab ,我會寫一個非常簡單的版本,不會像 CS:APP 課程那麼麻煩,像這篇文章(Bomb Lab 實作紀錄) 的簡化版本,但我們不玩 ARM 就玩 x86_64